home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / programs.arc / HANOI.PRO < prev    next >
Encoding:
Prolog Source  |  1986-10-07  |  2.5 KB  |  108 lines

  1. /* TOWERS OF HANOI */
  2. /*
  3.  This hanoi may be slowed down to see the solution.
  4.  Call the predicate hanoi with the number of disks you want.
  5.  Example:  Hanoi(6).
  6. */
  7.  
  8. DOMAINS
  9.   TIME, ROW, COL, NUMBER = INTEGER
  10. database
  11.   dlay(TIME)
  12.  
  13. PREDICATES
  14.   hanoi( NUMBER )
  15.   move(  NUMBER, NUMBER, ROW, ROW, ROW, COL, COL, COL )
  16.   inform(  NUMBER, NUMBER, ROW, ROW, COL, COL )
  17.   makepole( NUMBER, NUMBER, COL)
  18.   delay()
  19.   cleardelay
  20.   dd(Time)
  21.   move_vert(COL,NUMBER,ROW,ROW)
  22.   move_horizon(ROW,NUMBER,COL,COL)
  23.  
  24. CLAUSES
  25.  
  26. delay :- dlay(X),!,dd(X).
  27. dd(0):-!.
  28. dd(N):-N1=N-1,dd(N1).
  29.  
  30. hanoi(N) :-
  31.     N<=12,!,
  32.     VB=2+6*N,VH=3+N,CV=N, CM=3*N, CH=5*N,
  33.     STCOL=(79-6*N)/2, STROW=(25-VH)/2,
  34.     makewindow(1,7,7,"Hanoi",STROW,STCOL,VH,VB),
  35.     makepole(N,N,CV),
  36.     move(N,N,0,0,0,CV,CM,CH).
  37.  
  38. hanoi(_):- write("maximum 12 disks\n").
  39.  
  40. move(H,1,HA,_,HC,CA,_,CH):-!,
  41.     inform(H,1,HA,HC,CA,CH).
  42. move(H,N,HA,HB,HC,CA,CB,CC):-
  43.     N1=N-1,
  44.     HA1=HA+1,
  45.     move(H,N1,HA1,HC,HB,CA,CC,CB),
  46.     inform(H,N,HA,HC,CA,CC),
  47.     HC1=HC+1,
  48.     move(H,N1,HB,HA,HC1,CB,CA,CC).
  49.  
  50. inform( H, N, H1, H2, C1, C2 ):-
  51.     C11=C1-N,
  52.     C22=C2-N,
  53.     NN=2*N,
  54.     H11=H-H1,
  55.     H22=H-H2,
  56.     move_vert(C11,NN,H11,1),
  57.     move_horizon(1,NN,C11,C22),
  58.     move_vert(C22,NN,1,H22).
  59.  
  60. makepole(_,0,_):-!.
  61. makepole(H,N,C):-
  62.     HH=H-N,
  63.     inform(H,N,HH,HH,C,C),
  64.     N1=N-1,
  65.     makepole(H,N1,C).
  66.  
  67. move_vert(_,_,H,H):-!.
  68. move_vert(COL,SIZE,H1,H2):-
  69.     H1<H2,!, /* move up */
  70.     H11=H1+1,
  71.     field_attr(H11,COL,SIZE,112),
  72.     field_attr(H1,COL,SIZE,7),delay,
  73.     move_vert(COL,SIZE,H11,H2).
  74. move_vert(COL,SIZE,H1,H2):-
  75.     H1>H2,!, /* move down */
  76.     H11=H1-1,
  77.     field_attr(H11,COL,SIZE,112),
  78.     field_attr(H1,COL,SIZE,7),delay,
  79.     move_vert(COL,SIZE,H11,H2).
  80.  
  81. move_horizon(_,_,H,H):-!.
  82. move_horizon(ROW,SIZE,C1,C2):-
  83.     C1<C2,!, /* move right */
  84.     C11=C1+1,
  85.     HH=C1+SIZE,
  86.     field_attr(ROW,HH,1,112),
  87.     field_attr(ROW,C1,1,7),delay,
  88.     move_horizon(ROW,SIZE,C11,C2).
  89. move_horizon(ROW,SIZE,C1,C2):-
  90.     C1>C2,!, /* move left */
  91.     C11=C1-1,
  92.     HH=C11+SIZE,
  93.     field_attr(ROW,C11,1,112),
  94.     field_attr(ROW,HH,1,7),delay,
  95.     move_horizon(ROW,SIZE,C11,C2).
  96. cleardelay :-
  97.     retract(dlay(_)),fail.
  98. cleardelay.
  99.  
  100. goal
  101.   makewindow(3,6,4,"ENTER THE NUMBER OF DISKS",3,2,5,46),
  102.   write("number of disks: "),readint(Num),
  103.   write("select a speed 0(fast) to 1000(slow): "),
  104.   readint(Speed),
  105.   cleardelay,
  106.   assert(dlay(Speed)),
  107.   hanoi(Num).
  108.